package com.midele.goodstuff.util

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

object GsonUtils {
    private val gson = Gson()

    /**
     * 将对象转换为JSON字符串
     * @param obj 对象
     * @return String
     */
    fun toJson(obj: Any?): String {
        return gson.toJson(obj)
    }

    /**
     * 将JSON字符串转换为对象
     * @param json JSON字符串
     * @param clazz 类
     * @return T?
     */
    fun <T> fromJson(json: String, clazz: Class<T>): T? {
        return try {
            gson.fromJson(json, clazz)
        } catch (e: Exception) {
            null
        }
    }

    /**
     * 将JSON字符串转换为List对象
     * @param json JSON字符串
     * @param clazz 类
     * @return List<T>?
     */
    fun <T> fromJsonList(json: String, clazz: Class<T>): List<T>? {
        return try {
            val type = TypeToken.getParameterized(List::class.java, clazz).type
            gson.fromJson(json, type)
        } catch (e: Exception) {
            null
        }
    }


    /**
     * 将JSON字符串转换为List对象
     * @param json JSON字符串
     * @param clazz 类
     * @return List<T>?
     */
    fun <T> fromJsonMutableList(json: String, clazz: Class<T>): MutableList<T>? {
        return try {
            val type = TypeToken.getParameterized(MutableList::class.java, clazz).type
            gson.fromJson(json, type)
        } catch (e: Exception) {
            null
        }
    }


    /**
     * 将JSON字符串转换为Map对象
     * @param json JSON字符串
     * @param keyClass Map的key类型
     * @param valueClass Map的value类型
     * @return Map<K, V>?
     */
    fun <K, V> fromJsonMap(json: String, keyClass: Class<K>, valueClass: Class<V>): Map<K, V>? {
        return try {
            val type = TypeToken.getParameterized(Map::class.java, keyClass, valueClass).type
            gson.fromJson(json, type)
        } catch (e: Exception) {
            null
        }
    }
}